﻿using System;
using System.Windows.Forms;
using System.Xml;

namespace LastfmTopDownloader
{
    public static class Vk
    {
        public static void GetCode()
        {
            const string reqStrTemplate = 
                "http://oauth.vk.com/authorize?client_id={0}&scope=audio,offline&redirect_uri=http://api.vk.com/blank.html&disaplay=page&response_type=token";
            System.Diagnostics.Process.Start(
            string.Format(reqStrTemplate, Settings1.Default.VKAppId));
        }

        public static string GetSongUrl(string pair)
        {
            const string reqSong = "https://api.vk.com/method/audio.search.xml?q={0}&access_token={1}";
            var xmldoc = new XmlDocument();
            xmldoc.Load(string.Format(reqSong, pair, Settings1.Default.VkToken));
            var node = xmldoc.SelectSingleNode("response/audio/url");
            if (node != null)
            {
                string ok = node.FirstChild.Value;
                return ok;
            }
            throw new Exception("Song not found");
        }

        public static bool Authorize()
        {
            var testForm = new TestForm(); //Создаем форму
            var browser = (WebBrowser) testForm.Controls["webBrowser"]; //Получаем объект коспонента веббраузер
            browser.Navigated += AuthorizeProceed;

            browser.Navigate("http://api.vkontakte.ru/oauth/authorize?client_id=" + Settings1.Default.VKAppId +
                            "&scope=audio,offline&redirect_uri=" +
                            "http://api.vkontakte.ru/blank.html&display=popup&response_type=token");
            //показываем диалог авторизации
            testForm.ShowDialog();

            //проверяем были ли мы авторизованы и возвращаем значение
            return !String.IsNullOrWhiteSpace(Settings1.Default.VkToken) && !String.IsNullOrWhiteSpace(Settings1.Default.UserId);
        }

        private static void AuthorizeProceed(object sender, WebBrowserNavigatedEventArgs e)
        {
            //Разбираем ссылку на кусочки
            var parts = e.Url.AbsoluteUri.Split('#');
            //получаем объект браузера
            var browser = (WebBrowser)sender;
            //получаем объект формы авторизации
            var authform = (TestForm)browser.Parent;

            //проверяем, что нас перенаправили на нужный адрес при успешной авторизации
            if (parts[0] == "http://api.vkontakte.ru/blank.html")
            {
                //если ошибка, закрываем форму
                if (parts[1].Substring(0, 5) == "error") authform.Close();
                //если авторизация успешна
                else if (parts[1].Substring(0, 12) == "access_token")
                {
                    //разбираем ответ
                    parts = parts[1].Split('&');

                    //записываем данные
                    Settings1.Default.VkToken = parts[0].Split('=')[1];
                    Settings1.Default.UserId= parts[2].Split('=')[1];
                    Settings1.Default.FirstLaunch = false;
                    Settings1.Default.Save();
                    //закрываем форму авторизации
                    authform.Close();
                }
            }
            else
            {
                //неизвестный ответ при неудачном входе и нажатии кнопки "отмена"
                parts = e.Url.AbsoluteUri.Split('?');
                if (parts[0] == "http://api.vkontakte.ru/oauth/grant_access")
                    //снова переходим к авторизации
                    browser.Navigate("http://api.vkontakte.ru/oauth/authorize?client_id=" + Settings1.Default.UserId +
                       "&scope=audio,offline&redirect_uri=" +
                       "http://api.vkontakte.ru/blank.html&display=popup&response_type=token");
            }
        }
        
    }
}
